#include <pthread.h>
#include "Thread.hpp"
#include <iostream>
#include <cstdlib>
#include <vector>
#include <fcntl.h>
#include <functional>
#include <unistd.h>
using namespace std;
using namespace zzz;

int g_val = 1000;

// void testfun(int &n)
// {
//     while (1)
//     {
//         if (n > 0)
//         {
//             usleep(1000);
//             cout << "get a ticket:" << n << endl;
//             n--;
//         }
//         else if (n <= 0)
//         {
//             cout << "no ticket" << endl;
//             break;
//         }
//     }
// }

// int main()
// {
//     std::vector<Thread<int>> pths;

//     for (int i = 0; i < 5; i++)
//     {
//         std::string tname = "thread-" + std::to_string(i + 1);

//         pths.emplace_back(testfun, g_val, tname);
//     }
//     for (auto &thread : pths)
//     {
//         thread.start();
//     }
//     for (auto &thread : pths)
//     {
//         thread.join();
//     }
//     cout << "main end" << endl;

//     return 0;
// }

// 对线程的数据进行封装
class ThreadData
{
public:
    ThreadData(string &thread, int &ticket)
        : _threadname(thread), _ticket(ticket), _total(0)
    {
    }

    string _threadname;
    int _total;
    int &_ticket;
};

void testfun(ThreadData d)
{
    while (1)
    {
        if (d._ticket > 0)
        {
            usleep(1000);
            cout << d._threadname << " get a ticket:" << d._ticket << endl;
            d._ticket--;
            d._total++;
        }
        else if (d._ticket <= 0)
        {
            cout << "no ticket" << endl;
            break;
        }
    }
}

int main()
{
    std::vector<Thread<ThreadData>> pths;
    std::vector<ThreadData> das;
    das.reserve(10240);

    for (int i = 0; i < 3; i++)
    {
        std::string tname = "thread-" + std::to_string(i + 1);

        das.emplace_back(tname, g_val);
        pths.emplace_back(testfun, das.back(), tname);
    }
    for (auto &thread : pths)
    {
        thread.start();
    }
    for (auto &thread : pths)
    {
        thread.join();
    }
    for (auto &data : das)
    {
        cout << data._threadname << "::" << data._total << endl;
    }
    cout << "main end" << endl;

    return 0;
}
